when to use raise notimplementederror - python